home *** CD-ROM | disk | FTP | other *** search
/ START Magazine / START VOL 4 NO 3.st / CINIT.ARC / MMINIT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-07-12  |  2.1 KB  |  89 lines

  1. /*    Megamax program/accessory initialization */
  2.  
  3. /*                 by Samuel Streeper            */
  4. /*          Copyright 1989 Antic Publishing      */
  5.  
  6. #define lcode 8            /* Code segment start */
  7. #define codelen 12        /* Code segment length */
  8. #define ldata 16        /* Data segment start */
  9. #define datalen 20        /* Data segment length */
  10. #define lbss 24            /* Bss  segment start */
  11. #define bsslen 28        /* Bss  segment length */
  12.  
  13. extern _init(), _main(), main();
  14. extern int _stack_bot, _stack[];
  15.  
  16. char *_base;        /* points to base page of program */
  17. long _prog_size;    /* save size of program */
  18. int _app;        /* 0xff if application, 0 if accessory */
  19.  
  20. overlay "init!"
  21. asm {
  22.     _init:    /* initialization entry point; RTS plugged in by linker */
  23. }
  24.  
  25. overlay "main"
  26. asm {
  27.     _main:
  28.         lea        _main,A5
  29.     m1:    cmpi    #0x4ef9,-6(A5)    ;find top of jump table
  30.         bne    m2
  31.         subq    #6,A5
  32.         bra    m1
  33.  
  34.     m2:    suba    #0x100,A5        ;A5=basepage address
  35.         move.l    codelen(A5),D6
  36.         add.l    datalen(A5),D6
  37.         add.l    bsslen(A5),D6
  38.         add.l    #0x100,D6        ;D6=basepage+txtlen+datalen+bsslen+256
  39.  
  40.         move.l    lbss(A5), A0    ;swap data and bss segments
  41.         movea.l    A0, A1
  42.         adda.l    bsslen(A5), A1
  43.         move.l    datalen(A5), D0
  44.         subq.l    #1, D0            ;dbf loop is stupid
  45.         ble        swapcont        ;might not have any data
  46.     swap:
  47.         move.b    -(A0), -(A1)
  48.         dbf        D0,swap
  49.     swapcont:
  50.  
  51.         move.l    ldata(A5), A0        ;clear bss segment
  52.         move.l    bsslen(A5), D0
  53.         subq.l    #1, D0
  54.     clear:    
  55.         clr.b    (A0)+
  56.         dbf        D0, clear
  57.  
  58.         move.l    ldata(A5), A4        ;A4 points between bss and data
  59.         adda.l    bsslen(A5), A4
  60.  
  61.         lea        _stack_bot(A4),A7    ;setup user stack
  62.  
  63.         moveq    #0,D5
  64.         tst.l    0x24(A5)        ;do I have a parent?
  65.         sne        D5
  66.         beq        is_da            ;no, is desk acc
  67.  
  68.         move.l    D6,-(A7)        ;return storage above stack to system
  69.         move.l    A5,-(A7)
  70.         clr        -(A7)
  71.         move    #0x4a,-(A7)        ;Mshrink
  72.         trap    #1
  73.         lea        12(A7),A7
  74.  
  75.     is_da:
  76.         move.l    A5, _base(A4)
  77.         move.l    D6, _prog_size(A4)
  78.         move    D5, _app(A4)
  79.  
  80.         move.l    lcode(A5), A5    ;A5 points to jump table
  81.  
  82.         jsr        _init            ;initialize globals and statics now
  83.  
  84.         jsr        main            ;call application's entry point
  85.  
  86.         clr -(A7)                ;on return do Pterm0()
  87.         trap #1
  88. }
  89.